package com.nbsaas.boot;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * 通用文档文本读取工具，支持 PDF、Word(doc/docx) 等常见格式。
 * 依赖 Apache Tika 自动检测并提取文档文本内容。
 */
public class DocumentTextReader {

    /**
     * 从 Path 读取文本
     */
    public static String readText(Path path) throws IOException {
        try (InputStream is = Files.newInputStream(path)) {
            return readText(is, path.getFileName() != null ? path.getFileName().toString() : null);
        }
    }

    /**
     * 从 File 读取文本
     */
    public static String readText(File file) throws IOException {
        try (InputStream is = new FileInputStream(file)) {
            return readText(is, file.getName());
        }
    }

    /**
     * 从 InputStream 读取文本，可提供资源名称用于类型检测优化
     */
    public static String readText(InputStream is, String resourceName) throws IOException {
        AutoDetectParser parser = new AutoDetectParser();
        BodyContentHandler handler = new BodyContentHandler(-1); // -1 表示不限制长度
        Metadata metadata = new Metadata();
        if (resourceName != null && !resourceName.isEmpty()) {
            metadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, resourceName);
        }
        ParseContext context = new ParseContext();
        try {
            parser.parse(is, handler, metadata, context);
            String text = handler.toString();
            return text != null ? text.trim() : "";
        } catch (org.xml.sax.SAXException | TikaException e) {
            throw new IOException("解析文档失败: " + e.getMessage(), e);
        }
    }

    /**
     * 读取文本（带 OCR 回退）：当解析结果为空时，根据扩展名选择 PDF 或 Word 图片 OCR。
     * 启用 OCR 时打印日志。
     */
    public static String readTextWithOcrFallback(Path path) throws IOException {
        String text = readText(path);
        if (text != null && !text.isBlank()) {
            return text;
        }
        String name = path.getFileName() != null ? path.getFileName().toString().toLowerCase() : "";
        if (name.endsWith(".pdf")) {
            System.out.println("解析结果为空，启用 PDF OCR 识别: " + path);
            PdfImageOcrReader ocrReader = new PdfImageOcrReader();
            return ocrReader.extractText(path);
        }
        if (name.endsWith(".doc") || name.endsWith(".docx")) {
            System.out.println("解析结果为空，启用 Word 图片 OCR 识别: " + path);
            WordImageOcrReader wordOcrReader = new WordImageOcrReader();
            return wordOcrReader.extractText(path);
        }
        return text; // 非 PDF/Word，直接返回解析结果（可能为空）
    }
}